from functools import wraps
from flask import jsonify
from flask_jwt_extended import jwt_required as flask_jwt_required, get_jwt_identity
from applications.models.backend import Admin  # 显式导入Admin模型

def jwt_required():
    """
    一个自定义的JWT装饰器，用于包装flask_jwt_extended的jwt_required，
    并确保函数元数据被正确保留。
    """
    def decorator(fn):
        @wraps(fn)
        @flask_jwt_required()
        def wrapper(*args, **kwargs):
            return fn(*args, **kwargs)
        return wrapper
    return decorator

def require_permission(permission_code):
    """
    一个自定义的装饰器，用于检查用户是否具有特定权限。
    它必须在 @jwt_required() 之后使用。
    """
    def decorator(fn):
        @wraps(fn)
        @jwt_required()
        def _jwt_required_wrapper(*args, **kwargs):
            # 1. 获取当前用户的身份标识 (ID)
            current_user_id = get_jwt_identity()
            user = Admin.query.get(current_user_id)

            # 2. 检查用户是否存在
            if not user:
                return jsonify(message="用户不存在，认证失败"), 401

            # 3. 检查用户是否具有所需权限
            if not user.has_permission(permission_code):
                return jsonify(message="权限不足"), 403  # 403 Forbidden

            # 4. 如果权限检查通过，则执行原始的视图函数
            return fn(*args, **kwargs)

        return _jwt_required_wrapper

    return decorator
